package gespap2009;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class ControladorClientes {

    static List<Cliente> clientes;

    /*
	 * Aplicacion del patrón <<singleton>>
	 */
	private static ControladorClientes controladorClientes = null;

    private ControladorClientes() {
		clientes = new ArrayList<Cliente>();
	}

    public static ControladorClientes crearControladorClientes(){
		if (controladorClientes == null)
			controladorClientes = new ControladorClientes();
		return controladorClientes;
	}

    public void crearReserva(Cliente cliente, String fecha,
            List<EjemplarArticulo> ejemplaresAReservar){

        // Falta seguridad en fechas
        /*if (nombre.equalsIgnoreCase("")){
            System.out.println("El campo nombre no puede estar vacio");
            return;
        }*/
        //Cliente cliente_temp = obtenerCliente(nombre);

        if (cliente != null) {
            cliente.crearReserva(fecha, ejemplaresAReservar);
        }
	}

    /*
     * Se pueden crear reservas vacías, sin artículos.
     */
    public void crearReserva(Cliente cliente, String fecha){

        // Falta seguridad en fechas
        /*if (nombre.equalsIgnoreCase("")){
            System.out.println("El campo nombre no puede estar vacio");
            return;
        }*/
        //Cliente client = obtenerCliente(nombre);

        if (cliente!= null) {
            cliente.crearReserva(fecha);
        }
	}

    public List<EjemplarArticulo> obtenerArticulosReservados(Cliente cliente,
            String fecha){

        //List<EjemplarArticulo> lista_temp = new ArrayList<EjemplarArticulo>();

        // Falta seguridad en fechas.
        /*if (nombre.equalsIgnoreCase("")){
            System.out.println("El campo nombre no puede estar vacio");
            return lista_temp;
        }*/

        //Cliente cliente_temp = new Cliente();
        //cliente = obtenerCliente(nombre);
        return cliente.getReserva(fecha);
	}

    @SuppressWarnings("static-access")
    /*
     * Antes de añadir un cliente hay que ver si no se encuentra primero por
     * nombre o dni
     * El cliente puede no tener teléfono ni dirección.
     */
    public void añadirClienteNuevo (String nombre, String direccion,
            String telefono, String correo, String dni){

        Cliente cliente;

        if (nombre.equalsIgnoreCase("") ||
            dni.equalsIgnoreCase("")){
            System.out.println("El campo nombre y dni" + "no puede estar vacio");
            return;
        }

       if (buscarClienteRegistrado(nombre)== null){
            /*buscamos los clientes por nombre primero,
             luego por dni si hay repetidos */
            cliente = new Cliente (nombre, direccion, telefono,correo, dni);
			this.clientes.add(cliente);
			System.out.println("Se ha creado el cliente: " +
                    cliente.getNombre() +".");
       } else {
            if(buscarClienteRegistrado(dni)== null){
                cliente = new Cliente (nombre, direccion, telefono,correo, dni);
                this.clientes.add(cliente);
                System.out.println("Se ha creado el cliente: " +
                cliente.getNombre() +".");
            }else{
                System.out.println("No se ha añadido al sistema");
            }
       }

	}

    /*
     * Método genérico que busca un cliente por nombre o dni
     * si no lo encuentra por nombre, lo buscaría por dni.
     * devuelve el cliente si lo encuentra o null si no existe.
     */
   public Cliente buscarClienteRegistrado(String valor){

        int i;
        String cliente_valor1;
        String cliente_valor2;
        Cliente cliente_temp = new Cliente();
        Boolean encontrado = false;
		for (i=0; i<clientes.size(); i++){
			cliente_valor1 = clientes.get(i).getNombre();
            cliente_valor2 = clientes.get(i).getDni();

            if (cliente_valor1.equalsIgnoreCase(valor)){
				System.out.println("Encontrado cliente: " + valor);
				encontrado = true;
                cliente_temp = clientes.get(i);
                break;
			}else{
                if (cliente_valor2.equalsIgnoreCase(valor)){
				System.out.println("Encontrado cliente: " + valor);
				encontrado = true;
                cliente_temp = clientes.get(i);
                break;
                }
            }
        }

        if (!encontrado){
            System.out.println("No se ha encontrado el cliente: " + valor);
            cliente_temp = null;
        }

        return cliente_temp;
   }

   /*
    * Falta registrar la venta para un cliente anónimo.
    *
    */


   /*
 * Método que sirve para crear un pedido dado una lista de articulos que se
 * quieren pedir.
 * entrada: lista de articulos y cliente registrado
 * salida: -
 * resultado: crea una instancia de ejemplar de articulo por cada articulo del
 * array. Genera un número de pedido para ese cliente.
 * se coge la fecha y hora del sistema en la que se realiza el pedido.
 * Pre: un pedido sólo lo puede realizar un cliente registrado.
 */
    public void CrearPedido(List<Articulo> articulos,
            Cliente cliente){
        Calendar horap = Calendar.getInstance();//será la hora del sistema
        Calendar fechap = Calendar.getInstance();//será la fecha del sistema
        if(cliente != null){
            cliente.crearPedido(articulos, fechap, horap);
        }else{
            System.out.println("ERROR: el Cliente no existe");
        }
    }


 /* Método que recibe la cantidad de articulos que se quiere comprar para un
 * determinado articulo, e inserta los objetos articulo en la lista a pedir
 * entrada: Lista de articulos y cantidades de cada uno.
 * salida: devuelve la lista de productos que se quiere pedir, conformada por
 * articulos los cuales pueden ser repetidos, ya que se deben pedir n ejemplares
 * del mismo articulo.
 */
public List<Articulo> InsertarNumeroArticulos(List<Articulo> articulos,
                                         List<Integer> cantidades){
       int i=0;
       List<Articulo> listaProductos = new ArrayList<Articulo>();
      if(articulos.size()==cantidades.size()){
       while(i<articulos.size()){
            for(int j=0;j<cantidades.get(i); j++){
                
                listaProductos.add(articulos.get(i));
            }
       i++;
       }

       return listaProductos;
      }else{

        return null;
      }

}


 /*Método de prueba que imprime todos los pedidos de un cliente
 *
 *
 */
public void imprimirPedidos(Cliente cl){

    cl.imprimirPedidos();
}

}